MySQL: Free the results when QSqlQuery::finished() is called
authorDaniel Vrátil <dvratil@kde.org>
Sat, 1 Dec 2018 16:56:41 +0000 (17:56 +0100)
committerDmitry Shachnev <mitya57@debian.org>
Thu, 15 Aug 2019 14:15:39 +0000 (15:15 +0100)
Calling mysql_stmt_free_result() frees the results of the last
executed query while keeping the prepared statement valid. This
allows one to keep around prepared QSqlQueries without the overhead
of keeping all the results in memory.

Change-Id: I4589e90857cc4e9a6f9612799bfca967a67e2ab2
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
Gbp-Pq: Name mysql_free_results_when_qsqlquery_finished_is_called.patch

src/plugins/sqldrivers/mysql/qsql_mysql.cpp

index 49bceb88a0e87c34088a87b742ee7dffa75a7424..82fbe37644771ac5fa468b180f5542919206e86d 100644 (file)
@@ -193,6 +193,7 @@ protected:
     QSqlRecord record() const override;
     void virtual_hook(int id, void *data) override;
     bool nextResult() override;
+    void detachFromResultSet() override;
 
 #if MYSQL_VERSION_ID >= 40108
     bool prepare(const QString &stmt) override;
@@ -798,6 +799,15 @@ int QMYSQLResult::numRowsAffected()
     return d->rowsAffected;
 }
 
+void QMYSQLResult::detachFromResultSet()
+{
+    Q_D(QMYSQLResult);
+
+    if (d->preparedQuery) {
+        mysql_stmt_free_result(d->stmt);
+    }
+}
+
 QVariant QMYSQLResult::lastInsertId() const
 {
     Q_D(const QMYSQLResult);